# -*- coding: utf-8 -*-
"""
Author: chen xi
Date: 2025/4/28 下午2:36
File: logging_utils.py
"""

import logging

class ColorFormatter(logging.Formatter):
    """
    自定义 Formatter，为不同级别的日志添加颜色。
    """
    COLORS = {
        'DEBUG': '\033[94m',     # 蓝色
        'INFO': '\033[92m',      # 绿色
        'WARNING': '\033[93m',  # 黄色
        'ERROR': '\033[91m',    # 红色
        'CRITICAL': '\033[91m\033[5m',  # 红色 + 闪烁
    }
    RESET = '\033[0m'

    def format(self, record):
        log_color = self.COLORS.get(record.levelname, self.RESET)
        message = super().format(record)
        return f"{log_color}{message}{self.RESET}"


class Logger:
    """
    日志工具类，用于初始化和管理带颜色的日志记录器。
    """
    _logger = None  # 类级别的日志记录器实例

    @classmethod
    def initialize(cls, name="default_logger", log_level=logging.INFO, log_format=None):
        """
        初始化日志记录器，并配置带颜色的输出格式。

        :param name: 日志记录器的名称，默认为 "default_logger"
        :param log_level: 日志级别，默认为 logging.INFO
        :param log_format: 日志格式字符串，默认为 '%(asctime)s - %(levelname)s - %(message)s'
        """
        if cls._logger is None:
            # 创建日志记录器
            cls._logger = logging.getLogger(name)
            cls._logger.setLevel(log_level)
            # 避免重复添加 handler
            if cls._logger.hasHandlers():
                return

            # 设置默认的日志格式
            if log_format is None:
                log_format = '%(asctime)s - %(levelname)s - %(message)s'

            # 配置日志处理器（输出到控制台）
            console_handler = logging.StreamHandler()
            formatter = ColorFormatter(log_format)

            console_handler.setFormatter(formatter)

            # 添加处理器到日志记录器
            cls._logger.addHandler(console_handler)

    @classmethod
    def get_logger(cls):
        """
        获取日志记录器实例。

        :return: logging.Logger 实例
        """
        if cls._logger is None:
            cls.initialize()  # 如果未初始化，则使用默认配置初始化
        return cls._logger

    @classmethod
    def debug(cls, message):
        cls.get_logger().debug(message)

    @classmethod
    def info(cls, message):
        cls.get_logger().info(message)

    @classmethod
    def warning(cls, message):
        cls.get_logger().warning(message)

    @classmethod
    def error(cls, message):
        cls.get_logger().error(message)

    @classmethod
    def critical(cls, message):
        cls.get_logger().critical(message)


# 示例用法
if __name__ == "__main__":
    # 初始化日志工具类（可选）
    Logger.initialize(name="my_app_logger", log_level=logging.DEBUG)

    # 直接通过类名调用日志方法
    Logger.debug("这是一个调试信息")
    Logger.info("这是一个普通信息")
    Logger.warning("这是一个警告信息")
    Logger.error("这是一个错误信息")
    Logger.critical("这是一个严重错误信息")



